﻿#include "image_push_button.h"

#include <QPainter>
#include <QMouseEvent>
#include <QDebug>

ImagePushButton::ImagePushButton(QWidget *parent)
    :QPushButton(parent)
{
    m_status = NORMAL;
    m_leftmouse_pressed = false;
    setAutoDefault(false); // 不作为自动默认的按钮（获取默认焦点）
    setFlat(true); // 扁平化
}

ImagePushButton::~ImagePushButton()
{

}

void ImagePushButton::setImageName(QString &image_name)
{
    this->m_image_name = image_name;
    setFixedSize(QPixmap(image_name).size());
}

void ImagePushButton::enterEvent(QEvent *event)
{
    Q_UNUSED(event)

    m_status = ENTER;

    QPushButton::enterEvent(event);
}

void ImagePushButton::mousePressEvent(QMouseEvent *event)
{
    // 若点击鼠标左键
    if (event->button() == Qt::LeftButton)
    {
        m_leftmouse_pressed = true;
        m_status = PRESS;
    }

    // 下面的不要加，否则会引入默认的动画效果，下同
    //QPushButton::mousePressEvent(event);
}

void ImagePushButton::mouseReleaseEvent(QMouseEvent *event)
{
    Q_UNUSED(event);

    // 若在按钮区域内释放了鼠标左键才有效，这很重要，用来撤销操作!
    if (m_leftmouse_pressed && this->rect().contains(event->pos()))
    {
        m_leftmouse_pressed = false;
        m_status = ENTER;
        emit clicked();
    }

    //QPushButton::mouseReleaseEvent(event);
}

void ImagePushButton::leaveEvent(QEvent *event)
{
    m_status = NORMAL;

    QPushButton::leaveEvent(event);
}

void ImagePushButton::paintEvent(QPaintEvent *event)
{
    // 一定要交给系统处理，否则会刷新不正常！
    // 即使绘制程序被正常执行，界面上也没有更新（不是全部都出现这个问题）！
    // 因为这个问题调了一天。
    // 结论：系统的绘制是没问题的，你如果不调用它，它做的一些事你没做（也不知怎么做），就会出现问题。
    // 经验：所以尽量在满足业务需求的情况下尽量调用原先的函数来进行默认处理防止bug！
    // 至于写在最后面还是最前面，那就看业务需求了，写在前面的一些东西可能会被后续操作覆盖。
    // 一般来说paintEvent重写时需要在函数最前面调用原先默认的paintEvent。
    QPushButton::paintEvent(event);

    QPainter painter(this);
    QPixmap pixmap;

    switch (m_status)
    {
    case NORMAL:
        {
            pixmap.load(m_image_name);
            break;
        }
    case ENTER:
        {
            pixmap.load(m_image_name + QString("_hover"));
            break;
        }
    case PRESS:
        {
            pixmap.load(m_image_name + QString("_pressed"));
            break;
        }
    case NOSTATUS:
        {
            pixmap.load(m_image_name);
            break;
        }
    default:
        {
            pixmap.load(m_image_name);
            break;
        }
    }

    painter.drawPixmap(rect(), pixmap);
}
